package com.ruoyi.alert.service.impl;

import com.ruoyi.alert.domain.Alert;
import com.ruoyi.alert.service.AlertClientFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@Service
public class AlertServiceImpl {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private AlertClientFeign alertClientFeign;


    @Value("${alarm.redis-key-prefix}")
    private String redisKeyPrefix;

    @Value("${alarm.ttl-hours}")
    private int ttlHours;

    @Value("${alert.service.max-retries:3}")
    private int maxRetries;


    /**
     * 检查是否重复告警
     */
//    public boolean isDuplicate(Alert msg) {
//        if (msg.getProjectId() == null || msg.getDate() == null) {
//            throw new IllegalArgumentException("ProjectId 或 Date 不能为 null");
//        }
//
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//        String dateStr = sdf.format(msg.getDate());
//        String key = redisKeyPrefix + msg.getProjectId() + ":" + dateStr;
//
//        return Boolean.TRUE.equals(redisTemplate.hasKey(key));
//    }

    /**
     * 标记告警已发送
     */
//    public void markAsSent(Alert msg) {
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//        String dateStr = sdf.format(msg.getDate());
//        String key = redisKeyPrefix + msg.getProjectId() + ":" + dateStr;
//        redisTemplate.opsForValue().set(key, "1", ttlHours, TimeUnit.HOURS);
//    }

    /**
     * 发送告警
     */
//    public boolean sendAlert(Alert alert) {
//        // 检查是否重复告警
//        if (isDuplicate(alert)) {
//            logger.info("重复告警，已忽略: {}", alert);
//            return false;
//        }
//
//        // 重试机制
//        int retryCount = 0;
//        boolean success = false;
//
//        while (retryCount < maxRetries && !success) {
//            try {
//                retryCount++;
//                success = alertClientFeign.sendAlert(alert);
//
//                if (success) {
//                    // 发送成功，标记为已发送
//                    markAsSent(alert);
//                    logger.info("告警发送成功: {}", alert);
//                } else {
//                    logger.warn("告警发送失败，重试 {}/{}: {}", retryCount, maxRetries, alert);
//                }
//            } catch (Exception e) {
//                logger.error("告警发送异常，重试 {}/{}: {}", retryCount, maxRetries, alert, e);
//                if (retryCount >= maxRetries) {
//                    throw new RuntimeException("告警发送失败，达到最大重试次数", e);
//                }
//            }
//
//            // 如果不是最后一次尝试，等待一段时间再重试
//            if (!success && retryCount < maxRetries) {
//                try {
//                    Thread.sleep(1000 * retryCount); // 指数退避
//                } catch (InterruptedException ie) {
//                    Thread.currentThread().interrupt();
//                }
//            }
//        }
//
//        return success;
//    }

    public boolean isDuplicate(Alert msg) {
        if (msg.getProjectId() == null || msg.getDate() == null) {
            throw new IllegalArgumentException("ProjectId 或 Date 不能为 null");
        }

        // 使用日期（不含时间）作为键
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String dateStr = sdf.format(msg.getDate());
        String key = redisKeyPrefix + msg.getProjectId() + ":" + dateStr;

        return Boolean.TRUE.equals(redisTemplate.hasKey(key));
    }

    public void markAsSent(Alert msg) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String dateStr = sdf.format(msg.getDate());
        String key = redisKeyPrefix + msg.getProjectId() + ":" + dateStr;
        redisTemplate.opsForValue().set(key, "1", ttlHours, TimeUnit.HOURS);
    }


}